摘要
這篇文章以大家熟悉的「大地遊戲」為比喻,深入淺出地解說了 LangGraph 的狀態管理機制,並強調其在 AI 對話系統中的重要性。文章首先說明 LangGraph 的基本概念,將節點 (Node) 比喻為大地遊戲中的關卡,狀態 (State) 則如同參賽者的積分卡。接著,文章詳細介紹了 LangGraph 狀態的組成、如何追蹤對話歷史紀錄、狀態操作以及可視化狀態轉移等功能,並用程式碼範例和圖表清晰地展示這些功能的應用。最後,文章還提出了一些思考問題,引導讀者思考 LangGraph 的應用場景以及狀態管理在實際應用中的重要性。
你是否曾想過,大學校園裡常見的大地遊戲與最前沿的 AI 對話系統有何關聯?深入解析了LangGraph的運作機制,並透過大地遊戲的比喻,讓讀者輕鬆理解AI對話系統的工作原理。文章包含詳細的狀態管理示例、實作範例、歷史記錄查閱、狀態操作和可視化狀態轉移等多個主題,是對於想要學習或優化AI對話系統的開發者必讀的指南。通過這些內容,讀者能夠掌握LangGraph如何在複雜的對話場景中靈活應對各種挑戰。
想像一個設置在大學校園的大地遊戲。在這個遊戲中,校園的各個關卡就如同LangGraph中的節點(Node),而每一位參賽者就是要闖關達成目標的主角。參賽者手上都會有積分卡來記錄遊戲進度,不管過程如何,最終都會完成闖關。遊玩過程中,參賽者每到一關挑戰成功後得到分數,然後關主會指引前往下一個關卡。
大地遊戲是一種在特定場地進行的團康活動,透過多樣的遊戲形式和角色分工,促進團隊合作和參與者之間的互動,常見於台灣大學營隊中。這種遊戲形式與LangGraph的運作方式有許多相似之處,有助於我們理解AI對話系統的工作原理。
在LangGraph世界中,每次與圖進行互動時,系統都會生成一個新的state
(狀態)。這個狀態記錄著當前的情況、thread_id
(線程ID)、checkpoint_id
(檢查點ID)等重要信息。讓我們看一個具體的State
範例:
## 此為一個 State 範例內容
StateSnapshot(
values={'lnode': 'node_2', 'scratch': 'hi', 'count': 2},
next=('Node1',),
config={
'configurable': {
'thread_id': '1',
'checkpoint_ns': '',
'checkpoint_id': '1ef5603e-03f5-687a-8002-c289cfaa5499'
}
},
metadata={'source': 'loop', 'writes': {'Node2': {'lnode': 'node_2', 'count': 1}}, 'step': 2},
created_at='2024-08-09T04:00:11.891264+00:00',
parent_config={
'configurable': {
'thread_id': '1',
'checkpoint_ns': '',
'checkpoint_id': '1ef5603e-03d8-6216-8001-75db3daef60e'
}
}
)
這就是有趣的部分了,在這個結構中:
values
表達當前節點的狀態config
記錄時間戳和其他配置信息parent_config
記錄前一個節點的信息將其比喻回大地遊戲,values
就像是參賽者的積分卡,config
則記錄抵達每個關卡的時間,而thread_id
則用來識別不同的參賽者。
有些文件是寫說
thread_ts
,parent_ts
,根據官方文件 LangGraph v0.2,已經分別改名為checkpoint_id
以及parent_checkpoint_id
讓我們通過一個簡單的實例來了解LangGraph的運作機制。完整的程式碼可以在這裡找到,但我們將重點關注核心概念。
在這個例子中,我們定義了兩個節點Node1
和Node2
。每經過一個節點時,系統會進行count
計算。只有當count
達到或超過3時,對話才會進入__end__
狀態。
與圖互動後,可以看到在每個節點時的 count 數值。
LangGraph提供了強大的歷史記錄功能。使用graph.get_state_history()方法,我們可以獲取整個對話過程的所有狀態。以下是一個狀態快照的示例:
StateSnapshot(
values={'lnode': 'node_1', 'scratch': 'hi', 'count': 3},
next=('Node2',),
config={
'configurable': {
'thread_id': '1',
'checkpoint_ns': '',
'checkpoint_id': '1ef5603e-0410-65a5-8003-6c2a9c7a1b42'
}
},
metadata={'source': 'loop', 'writes': {'Node1': {'lnode': 'node_1', 'count': 1}}, 'step': 3},
created_at='2024-08-09T04:00:11.902254+00:00',
parent_config={
'configurable': {
'thread_id': '1',
'checkpoint_ns': '',
'checkpoint_id': '1ef5603e-03f5-687a-8002-c289cfaa5499'
}
}
)
為了方便分析,我們可以將歷史記錄存儲在一個列表中:
states = []
for state in graph.get_state_history(thread):
states.append(state.config)
print(state.config, state.values['count'])
LangGraph不僅允許我們查看完整的歷史記錄,還提供了獲取特定時間點狀態的功能。例如,使用graph.get_state(states[-3])
可以獲取倒數第三個狀態。
此外,LangGraph還支持更多細緻的操作,如更改狀態信息等。這些進階功能在官方教材《AI Agents in LangGraph》的Human-in-loop章節中有詳細說明。
為了更直觀地理解對話的進展,我們可以將圖中的狀態轉移以圖表形式展現。這樣可以清楚地看到當前節點位置以及各項計算數值的變化
在這個可視化中,我們可以注意到:
碎碎念時間
LangGraph 當下已經來到 v0.2 版本,有些函數可能或多或少有變化,請實作時留意版本號。官方教材中是擺放在 Human-in-loop 當中,沒有獨立概念跟機制來說明狀態轉移過程。摸了一段時間之後才找到相關的內容。對新手來說滿有挑戰的。
本文通過將 LangGraph 與大地遊戲進行類比,生動地解釋了 LangGraph 中的節點、狀態管理、運作機制,以及如何通過歷史紀錄與可視化工具來追蹤對話進程。這種比喻幫助我們更好地理解 AI 對話系統的運作方式,特別是在節點互動和狀態管理方面。
本篇教學程式碼位於比賽用 Repo,記得多多操作
參考資料:
checking-history:https://langchain-ai.github.io/langgraph/how-tos/human_in_the_loop/time-travel/#checking-history